Problem
【JOI2013】稻草人
Description
村有一片荒地,上面竖着个稻草人,村民们每年多次在稻草人们的周围举行祭典。
有一次,村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地。和启示中的一样,田地需要满足以下条件:
- 田地的形状是边平行于坐标轴的长方形
- 左下角和右上角各有一个稻草人
- 田地的内部(不包括边界)没有稻草人
给出每个稻草人的坐标,请你求出有多少遵从启示的田地的个数。
Input
第一行一个正整数,代表稻草人的个数。
接下来行,第行包含个由空格分隔的整数和,表示第个稻草人的坐标。
Output
Sample Input
1 | 4 |
Sample Output
1 | 3 |
HINT
所有满足要求的田地由下图所示:
互不相同。
互不相同。
标签:CDQ分治
单调栈
Solution
暑假听讲过这道题,当时用的是线段树上维护单调栈。
发现分治也可以用相同复杂度过掉此题,而且还更好写。
首先分治降维,把两维降成一维,即把的限制去掉。
先离散化,再按值排序,随后开始分治。
对于每次分治,把区间分为两个部分和,把值在两个区间内的分开。然后逐个加入值大于的点,并维护单调栈,再把所有值小于它且值小于等于的点加入另一个单调栈,再单调栈上二分找到分界点,统计以此点作为右上角可组成的方形个数。
Code
1 |
|